package dongshi.daddy.builder;

import dongshi.daddy.builder.origin.builder.concrete.IPhoneBuilder;
import dongshi.daddy.builder.origin.builder.concrete.MiPhoneBuilder;
import dongshi.daddy.builder.origin.director.PhoneDirector;
import dongshi.daddy.builder.origin.product.Phone;
import dongshi.daddy.builder.simplify.PhoneWithLombok;
import org.junit.Test;

/**
 * Builder Patter 建造者模式 Demo
 */
public class BuilderPatternDemo {

    @Test
    public void origin() {
        // 1. 创建一个导演
        PhoneDirector phoneDirector = new PhoneDirector();

        /***** 2. 建造 iPhone 手机 *****/
        
        // 2a. 创建一个 iPhone建造者
        IPhoneBuilder iPhoneBuilder = new IPhoneBuilder();
        // 2b. 导演指导 iPhone建造者 来建造一个iPhone的实例
        phoneDirector.construct(iPhoneBuilder);
        // 2c. 从 iPhone建造者 中获取实例
        Phone iPhone = iPhoneBuilder.getPhone();
        System.out.println(iPhone);

        /***** 3. 建造 Xiao Mi Phone 手机 *****/
        
        // 3a. 创建一个 MiPhone建造者
        MiPhoneBuilder miPhoneBuilder = new MiPhoneBuilder();
        // 3b. 导演指导 MiPhone建造者 来建造一个MiPhone的实例
        phoneDirector.construct(miPhoneBuilder);
        // 3c. 从 MiPhone建造者 中获取实例
        Phone miPhone = miPhoneBuilder.getPhone();
        System.out.println(miPhone);

    }

    @Test
    public void simplify() {
        dongshi.daddy.builder.simplify.Phone P40Pro
                = dongshi.daddy.builder.simplify.Phone.builder()  // 通过产品的静态方法获取建造者
                .brand("华为")         // "客户"(调用方)充当了Director这个角色
                .os("鸿蒙")
                .ramSize(12)
                .price(9999.99)
                .build();             // 获得建造完成的产品

        System.out.println(P40Pro);
    }


    @Test
    public void simplifyWithLombok() {
        PhoneWithLombok P40Pro
                = PhoneWithLombok.builder()  // 通过产品的静态方法获取建造者
                .brand("华为lombok")         // "客户"(调用方)充当了Director这个角色
                .os("lombok 操作系统")
                .ramSize(12)
                .price(9999.99)
                .build();             // 获得建造完成的产品

        System.out.println(P40Pro);
    }
}